<?php
// +----------------------------------------------------------------------
// | SparkERP 优秀的进销存系统
// +----------------------------------------------------------------------
// | Copyright (c) 2022~2099 http://erp.sparkshop.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: NickBai  <1902822973@qq.com>
// +----------------------------------------------------------------------
namespace app\service\data;

use app\model\data\Unit;
use app\validate\data\UnitValidate;
use think\exception\ValidateException;

class UnitService
{
    private Unit $unitModel;

    public function __construct(Unit $unitModel)
    {
        $this->unitModel = $unitModel;
    }

    /**
     * 获取单位列表
     * @param array $param
     * @return array
     */
    public function getList(array $param): array
    {
        $limit = $param['limit'] ?? 10;
        $name = $param['name'] ?? '';

        $where = [];
        if (!empty($name)) {
            $where[] = ['name', 'like', '%' . $name . '%'];
        }

        return $this->unitModel->getPageList($limit, $where);
    }

    /**
     * 添加单位
     * @param array $param
     * @return array
     */
    public function addUnit(array $param): array
    {
        try {
            validate(UnitValidate::class)->scene('add')->check($param);
        } catch (ValidateException $e) {
            return dataReturn(-1, $e->getError());
        }

        // 检查单位名称是否已存在
        $exists = $this->unitModel->findOne(['name' => $param['name']])['data'];
        if (!empty($exists)) {
            return dataReturn(-2, '该单位名称已存在');
        }

        $param['create_time'] = date('Y-m-d H:i:s');
        return $this->unitModel->insertOne($param);
    }

    /**
     * 编辑单位
     * @param array $param
     * @return array
     */
    public function editUnit(array $param): array
    {
        try {
            validate(UnitValidate::class)->scene('edit')->check($param);
        } catch (ValidateException $e) {
            return dataReturn(-1, $e->getError());
        }

        if (empty($param['id'])) {
            return dataReturn(-1, '缺少ID参数');
        }

        // 检查单位是否存在
        $unitInfo = $this->unitModel->getInfoById($param['id'])['data'];
        if (empty($unitInfo)) {
            return dataReturn(-2, '单位不存在');
        }

        // 检查单位名称是否已被其他记录使用
        $where = [
            ['name', '=', $param['name']],
            ['id', '<>', $param['id']]
        ];
        $exists = $this->unitModel->findOne($where)['data'];
        if (!empty($exists)) {
            return dataReturn(-3, '该单位名称已存在');
        }

        $param['update_time'] = date('Y-m-d H:i:s');
        return $this->unitModel->updateById($param, $param['id']);
    }

    /**
     * 删除单位
     * @param array $param
     * @return array
     */
    public function delUnit(array $param): array
    {
        if (empty($param['id'])) {
            return dataReturn(-1, '缺少ID参数');
        }

        // 检查单位是否存在
        $unitInfo = $this->unitModel->getInfoById($param['id'])['data'];
        if (empty($unitInfo)) {
            return dataReturn(-2, '单位不存在');
        }

        // TODO: 这里可以添加检查该单位是否被商品等其他模块使用的逻辑
        // 如果被使用则不允许删除

        return $this->unitModel->delById($param['id']);
    }
}